#include<bits/stdc++.h>
using namespace std;
int n,k,a[500005],g[1005][1005],f[500005],ans=INT_MAX;
struct node{
	int s,id;
}b[500005];
int cmp(node x,node y){return x.s<y.s;}
int CMP(node x,node y){return x.id<y.id;}
signed main(){
	freopen("sub.in","r",stdin);
	freopen("sub.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	if(n<=100){
		for(int i=1;i<=n-k+1;i++){
			for(int j=1;j<=k;j++) for(int p=1;p<=n;p++) g[j][p]=INT_MAX;
			g[1][i]=0;
			for(int j=i+1;j<=n;j++){
				for(int K1=2;K1<=k;K1++){
					for(int p=i;p<j;p++){
						g[K1][j]=min(max(g[K1-1][p],a[j]+a[p]),g[K1][j]);
//						cout<<" > "<<K1<<" "<<j<<" : "<<K1-1<<" "<<p<<" ( "<<g[K1-1][p]<<" "<<a[j]+a[p]<<" ) : "<<g[K1][j]<<'\n';
					}
				}
			}
			for(int j=i+1;j<=n;j++) {
				ans=min(ans,max(g[k][j],a[j]+a[i]));
			}
		}
		cout<<ans;
		return 0;
	}
	ans=0;
	for(int i=1;i<=n;i++) b[i].s=a[i],b[i].id=i;
	sort(b+1,b+n+1,cmp);
	sort(b+1,b+k+1,CMP);
	for(int i=1;i<k;i++){
		ans=max(ans,b[i].s+b[i+1].s);
	} ans=max(ans,b[1].s+b[k].s);
	cout<<ans;
	return 0;
}
/*
考虑尽量选小的
但是可能会有可能选 n 是 n-1 和 n-2 挨着的
可能结果还没有选 n+1 但是和 1 和 2 挨着的

但是如果考虑在两个数中间选一个数的话肯定是可以贪心的

*/
